package com.lele.dao;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

// Druid数据库连接池
public class JDBCUtilDao {
    private static DataSource dataSource = null;

    static {
        try {
            // 通过类加载器在classPath目录下获取资源.并且是以流的形式，相当于利用反射读取配置文件
            InputStream is = JDBCUtilDao.class.getClassLoader().getResourceAsStream("druid.properties");
            Properties properties = new Properties();
            // 加载流中的文件的数据，忘记了可参考 F01_Properties 类
            properties.load(is);
            // 创建数据源  工厂模式--> 创建对象，并把读到的内容放到数据源中
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 把 Connection 放到 ThreadLocal 里，这样确保了同一事务使用的是同一个 Connection
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();

    // 获取连接（这里有事务操作所以这样写，不然直接 return dataSource.getConnection();）
    public static Connection getConnection() throws SQLException {
        Connection conn = threadLocal.get();
        if (conn == null){
            threadLocal.set(dataSource.getConnection()); // 如果为空则去数据源中拿,并放入当前线程
        }
        return threadLocal.get();
    }

    // 释放资源
    public static void release(Statement st, ResultSet re) throws SQLException {
        if (re != null){
            re.close();
        }
        if (st != null){
            st.close();
        }
    }
    // 因为有事务操作，用的是同一个connection，dao层不关，等事务完成再关
    public static void closeConn() throws SQLException {
        Connection conn = threadLocal.get();
        if (conn == null){
            return;
        }
        if (conn != null){
            conn.close();
            threadLocal.set(null);
        }
    }
}